package cn.wolfcode.exception;

import cn.wolfcode.domain.JsonResult;
import com.alibaba.fastjson.JSON;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Description: 利用AOP对控制器增强, 处理 控制器出现的异常
 * @Author: 伍家钰
 * @Date: 2020/7/15 23:32
 * @Version: 1.0
 */
@ControllerAdvice
public class HandlerControllerException {
    /**
     * ExceptionHandler:代表当前方法是处理异常的,处理什么样的异常
     *
     * @param r:
     * @param response
     * @param handlerMethod :当前出异常的方法
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    public Object handlerException(RuntimeException r, HttpServletResponse response, HandlerMethod handlerMethod) {
        // 方便开发时找bug
        r.printStackTrace();
        String errorMsg = "操作失败,请联系管理员";
        // 判断是否有贴ResponseBody,有则返回json没有则跳转视图
        if (handlerMethod.hasMethodAnnotation(ResponseBody.class)) {
            // 判断是否是逻辑异常,是则用自定义异常自身的异常信息
            if (r instanceof LogicException) {
                errorMsg = r.getMessage();
            }
            JsonResult json = new JsonResult(false, errorMsg);
            response.setContentType("application/json;charset=utf-8");
            try {
                response.getWriter().print(JSON.toJSONString(json));

            } catch (IOException e) {
                e.printStackTrace();
            }
            // 因为Json对象用输出流输出去了,所以返回一个空值即可
            return null;
        } else {
            return "common/error";
        }
    }


    /**
     * 处理权限访问异常
     *
     * @param u
     * @param response
     * @param handlerMethod
     * @return
     */
    @ExceptionHandler(UnauthorizedException.class)
    public Object handlerException(UnauthorizedException u, HttpServletResponse response, HandlerMethod handlerMethod) {
        // 方便开发时找bug
        u.printStackTrace();
        // 判断是否有贴ResponseBody,有则返回json没有则跳转视图
        if (handlerMethod.hasMethodAnnotation(ResponseBody.class)) {
            JsonResult json = new JsonResult(false, "你没有权限操作!");
            response.setContentType("application/json;charset=utf-8");
            try {
                response.getWriter().print(JSON.toJSONString(json));
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 因为Json对象用输出流输出去了,所以返回一个空值即可
            return null;
        } else {
            return "common/nopermission";
        }
    }
}
